/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.db.explorer.dlg;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import java.io.InputStream;
import java.util.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.TableModelEvent;
import javax.swing.table.*;
import javax.swing.text.DefaultCaret;
import javax.swing.text.JTextComponent;
import org.openide.DialogDescriptor;
import org.openide.TopManager;
import org.openide.util.NbBundle;
import org.netbeans.lib.ddl.impl.*;
import org.netbeans.lib.ddl.util.*;
import org.netbeans.modules.db.explorer.*;
import org.netbeans.modules.db.util.*;
import org.netbeans.modules.db.explorer.infos.*;
import org.netbeans.modules.db.explorer.nodes.*;
/**
* xxx
*
* @author Slavek Psenicka
*/
public class AddTableColumnDialog
{
boolean result = false;
Dialog dialog = null;
Specification spec;
/**
* @associates Vector
*/
Map ixmap;
String colname = null;
JTextField colnamefield, colsizefield, colscalefield, defvalfield;
JTextArea checkfield;
JComboBox coltypecombo, idxcombo;
JCheckBox pkcheckbox, ixcheckbox, checkcheckbox, nullcheckbox, uniquecheckbox;
DataModel dmodel = new DataModel();
public AddTableColumnDialog(final Specification spe, final DatabaseNodeInfo nfo) {
spec = spe;
try {
JLabel label;
JPanel pane = new JPanel();
pane.setBorder(new EmptyBorder(new Insets(5,5,5,5)));
GridBagLayout layout = new GridBagLayout();
GridBagConstraints con = new GridBagConstraints ();
pane.setLayout (layout);
ResourceBundle bundle = NbBundle.getBundle("org.netbeans.modules.db.resources.Bundle");
TextFieldListener fldlistener = new TextFieldListener(dmodel);
IntegerFieldListener intfldlistener = new IntegerFieldListener(dmodel);
// Column name
label = new JLabel(bundle.getString("AddTableColumnName"));
con.weightx = 0.0;
con.anchor = GridBagConstraints.WEST;
con.insets = new java.awt.Insets (2, 2, 2, 2);
con.gridx = 0;
con.gridy = 0;
layout.setConstraints(label, con);
pane.add(label);
con.fill = GridBagConstraints.HORIZONTAL;
con.weightx = 1.0;
con.gridx = 1;
con.gridy = 0;
con.insets = new java.awt.Insets (2, 2, 2, 2);
colnamefield = new JTextField(35);
colnamefield.setName(ColumnItem.NAME);
colnamefield.addFocusListener(fldlistener);
layout.setConstraints(colnamefield, con);
pane.add(colnamefield);
// Column type
Map tmap = spec.getTypeMap();
Vector ttab = new Vector(tmap.size());
Iterator iter = tmap.keySet().iterator();
while (iter.hasNext()) {
String iterkey = (String)iter.next();
String iterval = (String)tmap.get(iterkey);
ttab.add(new TypeElement(iterkey, iterval));
}
ColumnItem item = new ColumnItem();
item.setProperty(ColumnItem.TYPE, ttab.elementAt(0));
dmodel.addRow(item);
label = new JLabel(bundle.getString("AddTableColumnType"));
con.weightx = 0.0;
con.anchor = GridBagConstraints.WEST;
con.insets = new java.awt.Insets (2, 2, 2, 2);
con.gridx = 0;
con.gridy = 1;
layout.setConstraints(label, con);
pane.add(label);
con.fill = GridBagConstraints.HORIZONTAL;
con.weightx = 1.0;
con.gridx = 1;
con.gridy = 1;
con.insets = new java.awt.Insets (2, 2, 2, 2);
coltypecombo = new JComboBox(ttab);
coltypecombo.addActionListener(new ComboBoxListener(dmodel));
coltypecombo.setName(ColumnItem.TYPE);
layout.setConstraints(coltypecombo, con);
pane.add(coltypecombo);
// Size subpane
JPanel subpane = new JPanel();
GridBagLayout sublayout = new GridBagLayout();
GridBagConstraints subcon = new GridBagConstraints ();
subpane.setLayout(sublayout);
// Column size
label = new JLabel(bundle.getString("AddTableColumnSize"));
subcon.weightx = 0.14;
subcon.anchor = GridBagConstraints.WEST;
subcon.insets = new java.awt.Insets (2, 2, 2, 2);
subcon.gridx = 0;
subcon.gridy = 0;
sublayout.setConstraints(label, subcon);
subpane.add(label);
subcon.fill = GridBagConstraints.HORIZONTAL;
subcon.weightx = 0.36;
subcon.gridx = 1;
subcon.gridy = 0;
subcon.insets = new java.awt.Insets (2, 2, 2, 10);
colsizefield = new ValidableTextField(new TextFieldValidator.integer());
colsizefield.setName(ColumnItem.SIZE);
colsizefield.addFocusListener(intfldlistener);
sublayout.setConstraints(colsizefield, subcon);
subpane.add(colsizefield);
// Column scale
label = new JLabel(bundle.getString("AddTableColumnScale"));
subcon.weightx = 0.14;
subcon.anchor = GridBagConstraints.WEST;
subcon.insets = new java.awt.Insets (2, 10, 2, 2);
subcon.gridx = 2;
subcon.gridy = 0;
sublayout.setConstraints(label, subcon);
subpane.add(label);
subcon.fill = GridBagConstraints.HORIZONTAL;
subcon.weightx = 0.36;
subcon.gridx = 3;
subcon.gridy = 0;
subcon.insets = new java.awt.Insets (2, 2, 2, 2);
colscalefield = new ValidableTextField(new TextFieldValidator.integer());
colscalefield.setName(ColumnItem.SCALE);
colscalefield.addFocusListener(intfldlistener);
sublayout.setConstraints(colscalefield, subcon);
subpane.add(colscalefield);
// Insert size subpane
con.weightx = 1.0;
con.weighty = 0.0;
con.gridwidth = 2;
con.fill = GridBagConstraints.BOTH;
con.insets = new java.awt.Insets (0, 0, 0, 0);
con.gridx = 0;
con.gridy = 2;
layout.setConstraints(subpane, con);
pane.add(subpane);
// Column default value
label = new JLabel(bundle.getString("AddTableColumnDefault"));
con.weightx = 0.0;
con.anchor = GridBagConstraints.WEST;
con.insets = new java.awt.Insets (2, 2, 2, 2);
con.gridx = 0;
con.gridy = 3;
layout.setConstraints(label, con);
pane.add(label);
con.fill = GridBagConstraints.HORIZONTAL;
con.weightx = 1.0;
con.gridx = 1;
con.gridy = 3;
con.insets = new java.awt.Insets (2, 2, 2, 2);
defvalfield = new JTextField(35);
defvalfield.setName(ColumnItem.DEFVAL);
defvalfield.addFocusListener(fldlistener);
layout.setConstraints(defvalfield, con);
pane.add(defvalfield);
// Check subpane
subpane = new JPanel();
subpane.setBorder(new TitledBorder(bundle.getString("AddTableColumnConstraintsTitle")));
sublayout = new GridBagLayout();
subcon = new GridBagConstraints ();
subpane.setLayout(sublayout);
ActionListener cbxlistener = new CheckBoxListener(dmodel);
subcon.weightx = 0.0;
subcon.anchor = GridBagConstraints.WEST;
subcon.gridx = 0;
subcon.gridy = 0;
pkcheckbox = new JCheckBox(bundle.getString("AddTableColumnConstraintPKTitle"));
pkcheckbox.setName(ColumnItem.PRIMARY_KEY);
pkcheckbox.addActionListener(cbxlistener);
sublayout.setConstraints(pkcheckbox, subcon);
subpane.add(pkcheckbox);
subcon.gridx = 1;
subcon.gridy = 0;
uniquecheckbox = new JCheckBox(bundle.getString("AddTableColumnConstraintUniqueTitle"));
sublayout.setConstraints(uniquecheckbox, subcon);
uniquecheckbox.setName(ColumnItem.UNIQUE);
uniquecheckbox.addActionListener(cbxlistener);
subpane.add(uniquecheckbox);
subcon.gridx = 2;
subcon.gridy = 0;
nullcheckbox = new JCheckBox(bundle.getString("AddTableColumnConstraintNullTitle"));
sublayout.setConstraints(nullcheckbox, subcon);
nullcheckbox.setName(ColumnItem.NULLABLE);
nullcheckbox.addActionListener(cbxlistener);
subpane.add(nullcheckbox);
// Insert subpane
con.weightx = 1.0;
con.weighty = 0.0;
con.gridwidth = 2;
con.fill = GridBagConstraints.BOTH;
con.insets = new java.awt.Insets (0, 0, 0, 0);
con.gridx = 0;
con.gridy = 4;
layout.setConstraints(subpane, con);
pane.add(subpane);
// Index name combo
con.gridx = 0;
con.gridy = 5;
con.gridwidth = 1;
ixcheckbox = new JCheckBox(bundle.getString("AddTableColumnConstraintIXTitle"));
layout.setConstraints(ixcheckbox, con);
ixcheckbox.setName(ColumnItem.INDEX);
ixcheckbox.addActionListener(cbxlistener);
pane.add(ixcheckbox);
try {
DatabaseMetaData dmd = nfo.getSpecification().getMetaData();
String catalog = (String)nfo.get(DatabaseNode.CATALOG);
String table = (String)nfo.get(DatabaseNode.TABLE);
DriverSpecification drvSpec = nfo.getDriverSpecification();
// ResultSet rs = dmd.getIndexInfo(catalog,nfo.getUser(),table, true, false);
drvSpec.getIndexInfo(catalog, dmd, table, true, false);
//if (dmd.getDatabaseProductName().trim().equals("ACCESS"))
// rs = dmd.getIndexInfo(catalog, null, table, true, false);
//else
// rs = dmd.getIndexInfo(catalog, dmd.getUserName(), table, true, false);
ixmap = new HashMap();
while (drvSpec.rs.next()) {
String ixname = drvSpec.rs.getString("INDEX_NAME");
if (ixname != null) {
Vector ixcols = (Vector)ixmap.get(ixname);
if (ixcols == null) {
ixcols = new Vector();
ixmap.put(ixname,ixcols);
}
ixcols.add(drvSpec.rs.getString("COLUMN_NAME"));
}
}
drvSpec.rs.close();
} catch (Exception e) {
//
}
con.fill = GridBagConstraints.HORIZONTAL;
con.weightx = 1.0;
con.gridx = 1;
con.gridy = 5;
con.insets = new java.awt.Insets (2, 2, 2, 2);
idxcombo = new JComboBox(new Vector(ixmap.keySet()));
layout.setConstraints(idxcombo, con);
pane.add(idxcombo);
// Check title and textarea
con.gridx = 0;
con.gridy = 6;
checkcheckbox = new JCheckBox(bundle.getString("AddTableColumnConstraintCheckTitle"));
layout.setConstraints(checkcheckbox, con);
checkcheckbox.setName(ColumnItem.CHECK);
checkcheckbox.addActionListener(cbxlistener);
pane.add(checkcheckbox);
con.fill = GridBagConstraints.BOTH;
con.insets = new java.awt.Insets (0,0,0,0);
con.gridwidth = 2;
con.gridheight = 1;
con.weightx = 1.0;
con.weighty = 1.0;
con.gridx =0;
con.gridy = 7;
checkfield = new JTextArea(3, 35);
checkfield.setName(ColumnItem.CHECK_CODE);
checkfield.addFocusListener(fldlistener);
JScrollPane spane = new JScrollPane(checkfield);
layout.setConstraints(spane, con);
pane.add(spane);
if (ixmap.size() == 0) {
pkcheckbox.setEnabled(false);
ixcheckbox.setEnabled(false);
idxcombo.setEnabled(false);
}
item.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String pname = evt.getPropertyName();
Object nval = evt.getNewValue();
if (nval instanceof Boolean) {
boolean set = ((Boolean)nval).booleanValue();
if (pname.equals(ColumnItem.PRIMARY_KEY)) {
pkcheckbox.setSelected(set);
} else if (pname.equals(ColumnItem.INDEX)) {
ixcheckbox.setSelected(set);
} else if (pname.equals(ColumnItem.UNIQUE)) {
uniquecheckbox.setSelected(set);
} else if (pname.equals(ColumnItem.NULLABLE)) {
nullcheckbox.setSelected(set);
}
}
}
});
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == DialogDescriptor.OK_OPTION) {
result = validate();
CommandBuffer cbuff = new CommandBuffer();
if (result) {
try {
boolean use_idx = false;
String tablename = nfo.getTable();
colname = colnamefield.getText();
ColumnItem citem = (ColumnItem)dmodel.getData().elementAt(0);
AddColumn cmd = spec.createCommandAddColumn(tablename);
org.netbeans.lib.ddl.impl.TableColumn col = null;
if (citem.isPrimaryKey()) {
col = (org.netbeans.lib.ddl.impl.TableColumn)cmd.createPrimaryKeyColumn(colname);
} else if (citem.isUnique()) {
col = (org.netbeans.lib.ddl.impl.TableColumn)cmd.createUniqueColumn(colname);
} else col = (org.netbeans.lib.ddl.impl.TableColumn)cmd.createColumn(colname);
if (citem.isIndexed()) use_idx = true;
col.setColumnType(Specification.getType(citem.getType().getType()));
col.setColumnSize(citem.getSize());
col.setDecimalSize(citem.getScale());
col.setNullAllowed(citem.allowsNull());
if (citem.hasDefaultValue()) col.setDefaultValue(citem.getDefaultValue());
cbuff.add(cmd);
if (citem.hasCheckConstraint()) {
cmd.createCheckConstraint(colname, citem.getCheckConstraint());
}
if (use_idx) {
String idxname = (String)idxcombo.getSelectedItem();
if (ixmap.containsKey(idxname)) {
cbuff.add(spec.createCommandDropIndex(idxname));
}
CreateIndex xcmd = spec.createCommandCreateIndex(tablename);
xcmd.setIndexName(idxname);
Enumeration enu = ((Vector)ixmap.get(idxname)).elements();
while (enu.hasMoreElements()) {
xcmd.specifyColumn((String)enu.nextElement());
}
xcmd.specifyColumn(citem.getName());
cbuff.add(xcmd);
}
cbuff.execute();
} catch (Exception e) {
e.printStackTrace();
result = false;
}
}
} else result = true;
if (result) {
dialog.setVisible(false);
dialog.dispose();
} else Toolkit.getDefaultToolkit().beep();
}
};
DialogDescriptor descriptor = new DialogDescriptor(pane, bundle.getString("AddColumnDialogTitle"), true, listener);
dialog = TopManager.getDefault().createDialog(descriptor);
dialog.setResizable(true);
} catch (MissingResourceException e) {
e.printStackTrace();
}
}
public boolean run() {
if (dialog != null) dialog.setVisible(true);
return result;
}
private boolean validate() {
Vector cols = dmodel.getData();
Enumeration colse = cols.elements();
while(colse.hasMoreElements())
if (!((ColumnItem)colse.nextElement()).validate())
return false;
return true;
}
public String getColumnName() {
return colname;
}
class CheckBoxListener implements ActionListener {
private DataModel data;
CheckBoxListener(DataModel data) {
this.data = data;
}
public void actionPerformed(ActionEvent event) {
JCheckBox cbx = (JCheckBox)event.getSource();
String code = cbx.getName();
data.setValue(new Boolean(cbx.isSelected()), code, 0);
}
}
class ComboBoxListener implements ActionListener {
private DataModel data;
ComboBoxListener(DataModel data) {
this.data = data;
}
public void actionPerformed(ActionEvent event) {
JComboBox cbx = (JComboBox)event.getSource();
String code = cbx.getName();
data.setValue(cbx.getSelectedItem(), code, 0);
}
}
class TextFieldListener implements FocusListener {
private DataModel data;
TextFieldListener(DataModel data) {
this.data = data;
}
public void focusGained(FocusEvent event) {
}
public void focusLost(FocusEvent event) {
JTextComponent fld = (JTextComponent)event.getSource();
String code = fld.getName();
data.setValue(fld.getText(), code, 0);
}
}
class IntegerFieldListener implements FocusListener {
private DataModel data;
IntegerFieldListener(DataModel data) {
this.data = data;
}
public void focusGained(FocusEvent event) {
}
public void focusLost(FocusEvent event) {
JTextComponent fld = (JTextComponent)event.getSource();
String code = fld.getName();
String numero = fld.getText();
Integer ival;
if (numero == null || numero.length()==0) numero = "0";
ival = new Integer(numero);
data.setValue(ival, code, 0);
}
}
}
/*
* <<Log>>
* 12 Gandalf 1.11 3/3/00 Radko Najman scale field added
* 11 Gandalf 1.10 2/16/00 Radko Najman driver adaptor
* 10 Gandalf 1.9 11/15/99 Radko Najman MS ACCESS
* 9 Gandalf 1.8 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 8 Gandalf 1.7 10/8/99 Radko Najman getUser() method
* replaced by dmd.getUserName()
* 7 Gandalf 1.6 9/13/99 Slavek Psenicka
* 6 Gandalf 1.5 9/13/99 Slavek Psenicka
* 5 Gandalf 1.4 9/8/99 Slavek Psenicka adaptor changes
* 4 Gandalf 1.3 7/21/99 Slavek Psenicka Disabling index combo
* with no index in place
* 3 Gandalf 1.2 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 2 Gandalf 1.1 5/21/99 Slavek Psenicka new version
* 1 Gandalf 1.0 5/14/99 Slavek Psenicka
* $
*/